审计前如何准备资料和代码? 客户审计清单请收好
对于区块链行业来说,无论是由内部安全团队还是第三方公司执行安全审计,对于确保系统的安全性都是至关重要的。
一份安全审计报告也许只是一个文件,但其内容承载的是与安全和收益息息相关的重要信息。
近日,币安智能链(BSC)与区块链网络安全领军企业CertiK正式达成合作,共同努力为可持续的区块链行业做出贡献。
完成一次安全审计所耗甚大,在这里币安智能链与CertiK团队共同为大家提供一份帮助项目方优化预算并且提高效率的安全审计准备清单。
干货:安全审计准备清单
确定审计范围与安全目标
测试范围是指安全审计的内容与方式。明确大致的审计范围和安全目标有助于公司更好地为安全审计做准备。
对于智能合约,是测试所有文件,还是最关键模块中的某些功能?对于应用程序渗透测试,你想要白盒测试还是黑盒测试?黑盒测试模仿了现实世界中的场景,以找出没有内幕信息的攻击者可以发现和利用的内容,白盒测试则是在了解内部信息的情况下对整个系统进行更加全面的安全审查。
因此在确定审计范围时,需要先明确以下问题:
本次安全审计/渗透性测试的首要目标是什么?
对你的系统来说,哪个模块最为关键?
你是否特别关注某种特定的攻击情形?
通过这些问题的答案,CertiK安全团队可以更有效地针对特定区域优化资源,设计出满足需求的测试方案。
说明文档
安全审计工程师在深入客户的代码库之前,必须先了解系统的设计和架构。
因此在开始安全审计之前,最重要的一点就是:项目方必须提供解释其系统工作方式的全面而清晰的说明文档。
说明文档应当易于阅读,并提供准确的最新信息,从而让审计工程师理解代码所含有的确切意图,文档中应当包含的明细如下:
1. 自述文件
自述文件应包含一系列的实用信息,例如项目描述、项目创建与运行说明等内容。
2. 技术文档
技术文档应包含系统概述、项目待解决的问题以及系统中不同组件的预期功能。
3. 代码注释
代码注释可以有效地推进审计进程,应注明代码想要实现的目标或可能含有的潜在问题,例如边界条件、参数验证和极端情况等。
代码质量
代码质量也会影响审计的效率。那么如何提供更高质量的代码呢?CertiK团队有着如下建议:
1. 代码风格保持一致
使用同样的代码风格有助于审计人员快速了解代码功能。为了保证代码一致性,建议使用linter分析源代码,并标记编程错误、漏洞、格式错误和可疑结构。这样开发人员可以运行linter来修复代码错误及警告信息。
2. 删除无效代码与注释
很多项目组件可能在软件开发期间已被弃用。删除无效代码和注释可以为审计工程师提高效率。
3. 使用可信的外部依赖项
在开发智能合约或应用程序时,工程师可以利用很多现有的数据库。使用通过审核的现有数据库可以有效地简化开发过程,并大幅减少出现安全问题的可能。
因此,请及时关注某些依赖项中出现的新安全问题,并确保项目中的第三方数据库和依赖项都为最新版本,以避免相关的安全问题发生。
执行首轮测试
将代码交给审计工程师之前,最好确保代码能够被正确地并依照预期来运行。
1. 开发人员应编写关于系统所有功能的单元测试,包含执行合约的一般路径,以及每项功能的极端情况和错误处理。
2. 编写其他测试,主要针对多组件和更高级的所有潜在用例。
3. 当代码更新时,切记更新单元测试,以确保新代码与所有测试互相兼容。
4. 注意记录测试过程中的详细信息,包括测试计划、测试方案、测试用例以及跟踪矩阵。在审查代码之前,如果审计工程师可以获取内容详尽的单元测试与测试文档,他们将对需要审计的系统有更深的理解。
设置测试对象
开展工作之前,必须有一个明确的测试对象,比如需要审计的源代码、需要渗透性测试的应用程序和认证信息,或者需要IoT硬件测试的实体设备。
为了让安全审计更加高效,CertiK团队提出如下建议:
1. 明确的Commit Hash
请提供commit hash来“锁定”审计工程师所查看的代码的版本,以确保审计工程师审查的是正确的代码。如果代码尚在开发阶段,最好推迟审计时间。
2. 稳定的测试环境
在渗透性测试开始之前,项目方需要先将应用程序托管给测试员。无论采用何种测试方法,一个稳定的测试环境对于任何渗透性测试来说都至关重要。
解决潜在的服务器问题所要付出的时间从几个小时到一天不等,具体取决于双方的沟通进度,以及问题的难度。
3. 编译后的二进制文件
对于移动设备和桌面应用程序的测试,通常需要提供编译后的二进制文件或安装包。
当一切准备就绪后,项目方即可可以将源代码、应用程序以及必要的文档发送给CertiK安全团队进行审计了。充足的准备可以让安全工程师专注于最重要的任务:提升产品的安全性。
因此尽管按照审计清单内来进行所有的准备会花费大量的时间,但这必不可少。
结语
往期回顾
安全分析:8月数字货币相关攻击事件分析总结
CertiK已对RioDeFi三个模块进行审计并完成RioWallet渗透测试